/**
 * 获取 浏览器 拍照的权限
 */

/**
 * 获取浏览器权限
 * @param option
 */
function getCamera(option) {
    // 获取video和canvas元素
    const video = document.getElementById('videoCamera');
    const canvas = document.getElementById('canvasCamera');
    
    if (!video || !canvas) {
        throw new Error('无法获取摄像头元素');
    }

    // 获取canvas上下文
    const ctx = uni.createCanvasContext('canvasCamera');
    if (!ctx) {
        throw new Error('无法获取canvas上下文');
    }

    // 设置canvas尺寸
    canvas.width = option.videoWidth;
    canvas.height = option.videoHeight;

    // 获取媒体属性，旧版本浏览器可能不支持mediaDevices，我们首先设置一个空对象
    if (navigator.mediaDevices === undefined) {
        navigator.mediaDevices = {};
    }
    // 一些浏览器实现了部分mediaDevices，我们不能只分配一个对象
    // 使用getUserMedia，因为它会覆盖现有的属性。
    // 这里，如果缺少getUserMedia属性，就添加它。
    if (navigator.mediaDevices.getUserMedia === undefined) {
        navigator.mediaDevices.getUserMedia = function (constraints) {
            // 首先获取现存的getUserMedia(如果存在)
            var getUserMedia =
                navigator.webkitGetUserMedia ||
                navigator.mozGetUserMedia ||
                navigator.getUserMedia;
            // 有些浏览器不支持，会返回错误信息
            // 保持接口一致
            if (!getUserMedia) {
                //不存在则报错
                return Promise.reject(
                    new Error("getUserMedia is not implemented in this browser")
                );
            }
            // 否则，使用Promise将调用包装到旧的navigator.getUserMedia
            return new Promise(function (resolve, reject) {
                getUserMedia.call(navigator, constraints, resolve, reject);
            });
        };
    }

    var constraints = {
        audio: false,
        video: {
            width: option.videoWidth,
            height: option.videoHeight,
            facingMode: 'user' // 使用前置摄像头
        }
    };

    // 获取摄像头流
    navigator.mediaDevices.getUserMedia(constraints)
        .then(function (stream) {
            // 直接设置视频源
            video.srcObject = stream;

            // 等待视频加载完成后播放
            video.onloadedmetadata = function (e) {
                video.play().catch(err => {
                    console.error('视频播放失败:', err);
                    throw err;
                });
            };
        })
        .catch((err) => {
            console.error('获取摄像头失败:', err);
            throw err;
        });

    // 保存引用
    option.thisVideo = video;
    option.thisContext = ctx;
    option.thisCanvas = canvas;
    
    return option;
}

/**
 * 绘制图片
 * 返回格式为base64
 * @param option
 */
function draw(option) {
    return new Promise((resolve, reject) => {
        try {
            // 将视频帧绘制到canvas
            option.thisContext.drawImage(
                option.thisVideo,
                0,
                0,
                option.videoWidth,
                option.videoHeight
            );
            
            // 调用 draw 方法
            option.thisContext.draw(false, () => {
                // 获取图片数据
                uni.canvasToTempFilePath({
                    canvasId: 'canvasCamera',
                    success: (res) => {
                        resolve(res.tempFilePath);
                    },
                    fail: (error) => {
                        console.error('获取图片数据失败:', error);
                        reject(error);
                    }
                });
            });
        } catch (error) {
            console.error('绘制图片失败:', error);
            reject(error);
        }
    });
}

export default {
    getCamera,
    draw
}